package org.dtrd.modules.control.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.dtrd.config.system.Constant;
import org.dtrd.modules.achievement.entity.bean.WeekRecordSummary;
import org.dtrd.modules.control.entity.bean.PatientTargetValue;
import org.dtrd.modules.control.entity.bean.TargetTable;
import org.dtrd.modules.control.entity.po.DtrdEntRdSigninTargetDetail;
import org.dtrd.modules.patient.entity.bean.report.ControllerTargetReport;
import org.dtrd.modules.patient.entity.bean.report.ReportTable;
import org.dtrd.modules.patient.entity.bean.report.ReportTargetBean;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 *
 */
public interface IDtrdEntRdSigninTargetDetailService extends IService<DtrdEntRdSigninTargetDetail> {

    List<DtrdEntRdSigninTargetDetail> getTargetDetailList(@Param("targetId") Integer targetId);

    boolean removeTargetDetails(Integer targetId);

    /**
     * 获取周报报告的控制目标
     * @return
     */
    ReportTable getReportWeekTargets0(Integer patientId, String startDate, String endDate);

    /**
     *
     * @param patientId
     * @param startDate
     * @param endDate
     * @return
     * @deprecated 该方法已弃用，计算方式有误，请使用getReportWeekTargetsV2方法
     */
    ReportTable getReportWeekTargets(Integer patientId, String startDate, String endDate);

    /**
     * 获取患者首页的控制目标表格
     * @param patientId
     * @return
     */
    ReportTable getReportWeekTargetsV2(Integer patientId);

    /**
     * 根据日期对获取相对应的打卡计划列表
     * @param patientId
     * @param dateArray
     * @return
     */
    List<Map<Integer, DtrdEntRdSigninTargetDetail>> getWeekSigninTargetDetail(Integer patientId, List<List<Date>> dateArray);

    /**
     * 生成周报、月报等的控制目标表格
     * @param patientId
     * @param startDate
     * @param endDate
     * @param lastStartDate
     * @param lastEndDate
     * @flag 比较是否查询上个周期的信息，比较的结果为lastEndDate>lastStartDate
     * @return
     */
    List<ControllerTargetReport> getPeriodReportTarget(Integer patientId, String startDate, String endDate, String lastStartDate, String lastEndDate, boolean flag, Constant.ReportType reportType);

    /**
     * 获取总结报告的控制目标表格，获取其初始值，与参考值。总结报告的最终值为输入框输入，趋势为最终值-初始值
     * @param patientId
     * @param startDate
     * @param endDate
     * @return
     */
    List<ControllerTargetReport> getSummaryReportTarget(Integer patientId, String startDate, String endDate);

    /**
     * 获取患者打卡的初始值
     * @param patientId
     * @param targetProject
     * @return
     */
    Float getFirstTargetValue(Integer patientId, Constant.TargetProject targetProject);

    /**
     * 获取患者周期内的打卡平均值
     * @param patientId
     * @param startDate
     * @param endDate
     * @param targetProject
     * @return
     */
    Float getAvgTargetValue(Integer patientId, String startDate, String endDate, Constant.TargetProject targetProject);

    /**
     * 保存控制目标详情中真实值的字段
     */
    boolean saveTargetDetailRealValue(Integer targetId, Float value, Integer projectType);

    Map<Integer, Integer> getTargetIdToReachStandardRate(Integer patientId, String startDate, String endDate);

    /**
     * 获取月报的控制目标
     */
    List<ReportTargetBean> getReportFirstTargets(Integer patientId);

    /**
     * 获取患者最新的控制目标信息
     */
    PatientTargetValue getPatientHomePageInfo(Integer patientId);

    /**
     * 获取患者本周的控制目标实际值
     * @param type 1 查询本周内的记录，2 查询上周的记录
     */
    PatientTargetValue getPatientTargetRealValue(Integer patientId, Integer type);

    /**
     * 查询患者周总结
     */
    List<WeekRecordSummary> getWeekSummary(Integer patientId);

    /**
     * 获取患者控制目标表格
     */
    TargetTable getPatientTargetTable(Integer patientId);

    /**
     * 获取患者控制目标表格，小程序返回接口
     * @param patientId
     * @return
     */
    TargetTable getPatientTargetTableV2(Integer patientId);
}
